/* 
 *  Este arquivo é parte do software TODO Calculadora. TODO Calculadora é um software livre;
 *  você pode redistribui-lo e/ou modifica-lo dentro dos termos da Licença Pública Geral GNU
 *  como publicada pela Fundação do Software Livre (FSF); na versão 2 da Licença,
 *  ou (na sua opnião) qualquer versão.
 *  
 *	Este programa é distribuido na esperança que possa ser útil, mas SEM NENHUMA GARANTIA;
 *  sem uma garantia implícita de ADEQUAÇÂO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
 *  Veja a Licença Pública Geral GNU para maiores detalhes. Você deve ter recebido uma cópia
 *  da Licença Pública Geral GNU junto com este programa, se não, escreva para a Fundação do
 *	Software Livre(FSF)
 *
 *	Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

package externa.operacao;

import enums.OperacaoBinaria;
import enums.OperacaoUnaria;

/**
 * Interface para usuário realizar chamadas de cálculos, seja operações binárias
 * ou unárias.
 * 
 * @author Willyan Guimarães Caetano
 * 
 */
public interface Operacao {

	/**
	 * Realiza chamada para operação binária
	 * 
	 * @param elementoUm
	 *            Primeiro elemento
	 * @param elementoDois
	 *            Segundo elemento
	 * @param operacaoSelecionada
	 * @return Resultado do cálculo
	 */
	Number calcula(double elementoUm, double elementoDois,
			OperacaoBinaria operacaoSelecionada);

	/**
	 * Realiza chamada para uma operação unária
	 * 
	 * @param elemento
	 *            Elemento a ser utilizada na operação
	 * @param operacaoSelecionada
	 *            Operação Selecionada
	 * @return Resultado do cálculo
	 */
	Number calcula(double elemento, OperacaoUnaria operacaoSelecionada);
	
	
	/**
	 * Inicializa a operação de soma. Depende da chamada do método com().
	 * 
	 * @param elemento Primeiro elemento
	 * @return Objeto para chamada contatenada do método com().
	 */
	Operacao soma(double elemento);
	
	/**
	 * Recebe o segundo operando da operação e retorna o resultado
	 * 
	 * @param elemento Segundo elemento
	 * @return Resultado
	 */
	Number com(double elemento);
	
	/**
	 * Inicializa a operação de divisao. Depende da chamada do método com().
	 * 
	 * @param elemento Primeiro elemento
	 * @return Objeto para chamada contatenada do método com().
	 */
	Operacao divide(double elemento);
	
	
	/**
	 * Inicializa a operação de multiplicação. Depende da chamada do método com().
	 * 
	 * @param elemento Primeiro elemento
	 * @return Objeto para chamada contatenada do método com().
	 */
	Operacao multiplica(double elemento);
	
	
	/**
	 * Inicializa a operação de subtração. Depende da chamada do método com().
	 * 
	 * @param elemento Primeiro elemento
	 * @return Objeto para chamada contatenada do método com().
	 */
	Operacao subtrai(double elemento);
	
	/**
	 * Inicializa operação de raiz quadrada
	 * 
	 * @param elemento Elemento 
	 * @return Resultado raiz quadrada
	 */
	Number raizQuadrada(double elemento);
	
	
	

}